package com.java.code.base;

import org.junit.Test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author weichuanyuan
 * @version 1.0
 * @date 2021/9/4 13:21
 */
public class ArithmeticUtil {
    /**
     * BigDecimal操作
     */
    @Test
    public void decimalOper() {
        BigDecimal d1 = new BigDecimal(100);
        BigDecimal d2 = new BigDecimal(2);
        System.out.println(d1.multiply(d2));//乘
        System.out.println(d1.divide(d2));//除
        System.out.println(d1.add(d2));//加
        System.out.println(d1.subtract(d2));//减
    }

    /**
     * List集合排序比较
     * 返回正数是 正序
     * 返回负数 是倒序
     */
    @Test
    public void decimalSort() {
        List<BigDecimal> all = new ArrayList() {
            {
                add(new BigDecimal(10));
                add(null);
                add(null);
                add(new BigDecimal(5));
                add(new BigDecimal(1));
            }

        };

        List<BigDecimal> sort = all.stream()
                .sorted(new Comparator<BigDecimal>() {
                    @Override
                    public int compare(BigDecimal o1, BigDecimal o2) {
                        if (o1 == null && o2 == null) {
                            return 0;
                        }
                        if (o1 == null) {
                            return -1;
                        }
                        if (o2 == null) {
                            return 1;
                        }
                        return o1.compareTo(o2) > 0 ? 1 : -1;
                    }
                }).collect(Collectors.toList());
        System.out.println(sort);
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指 定精度，以后的数字四舍五入。
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
